home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / dvitovdu / unix / c / vis500vdu.c < prev    next >
C/C++ Source or Header  |  1990-10-01  |  8KB  |  240 lines

  1. /* Original Author:         Andrew Trevorrow
  2.    Implementation: Modula-2 under VAX/UNIX 4.2 BSD
  3.    Date Started:   June, 1986
  4.  
  5.    Description:
  6.    Implements the InitVIS500()procedure that initializes the terminal dependent
  7.    routines and parameters used in DVItoVDU.
  8.    The VISUAL 500 has an Alphanumeric mode in which it behaves like a VT52.
  9.    DVItoVDU assumes text lines on the screen start at 1 and increase
  10.    downwards; MoveAbs()does the necessary translation to VT52 coordinates.
  11.    Note that the VIS500 is very similar to a VT640 (except that the VT640 acts
  12.    like a VT100 in what it calls Transparent mode).
  13.  
  14.    The VIS500 can also emulate a Tektronix 4010 terminal in which the screen
  15.    is 780 pixels high by 1024 pixels wide.
  16.    (The actual resolution of the VIS500 screen is 585 by 768 pixels;
  17.    the appropriate 3:4 scaling is done automatically.)
  18.    The bottom left pixel is the point (x=0,y=0). Note that x coordinates
  19.    increase to the right and y coordinates increase up the screen.
  20.    DVItoVDU uses a coordinate scheme in which horizontal (=h) coordinates
  21.    also increase to the right but vertical (=v) coordinates increase DOWN the
  22.    screen, i.e. the top left pixel on the screen is the point (h=0,v=0).
  23.    This means that the Tektronix 4010 routines will have to do a
  24.    simple translation of the vertical coordinates passed by DVItoVDU.
  25.  
  26.    For DVItoVDU to be able to display both Alphanumeric text and Tektronix
  27.    mode graphics, the F6 function key must = BOTH.
  28.  
  29.    This version converted to C and ported to BSD and System V UNIX by
  30.    some chaps at Kernel Technology up to September 1989.  Contact
  31.    mjh@uk.co.kernel (Mark J. Hewitt) with bug fixes etc.
  32.  
  33.    Involved were:    Mark J. Hewitt
  34.                Dave Dixon
  35.             Marc Hadley
  36. */
  37.  
  38. #include "def.h"
  39.  
  40. static char *sccsid[] = "@(#)vis500vdu.c    1.1";
  41.  
  42. extern void SendXYtek();
  43.  
  44. extern Void TEK4010ClearScreen(),
  45.             TEK4010StartGraphics(),
  46.             TEK4010StartText(),
  47.             TEK4010ShowChar(),
  48.             TEK4010LoadFont();
  49.  
  50. extern unsigned int dragdown;
  51. extern short havesentxy;
  52.  
  53.  
  54. Void VIS500MoveToTextLine ();
  55. Void VIS500ClearTextLine ();
  56. Void VIS500ClearScreen ();
  57. Void VIS500ShowChar ();
  58. Void VIS500ShowRectangle ();
  59. Void VIS500ResetVDU ();
  60. Void VIS500MoveAbs ();
  61.  
  62. /******************************************************************************/
  63.  
  64. void InitVIS500 ()
  65. {
  66.  
  67. /* The dialog region will be the top 4 text lines in Alphanumeric mode:
  68.       Line 1 = DVI status line,
  69.       Line 2 = window status line,
  70.       Line 3 = message line,
  71.       Line 4 = command line.
  72.    The window region will be text lines 5 to 33 in Alphanumeric mode.
  73. */
  74.  
  75.   DVIstatusl = 1;        /* DVItoVDU assumes top text line = 1 */
  76.   windowstatusl = 2;
  77.   messagel = 3;
  78.   commandl = 4;
  79.   bottoml = 33;            /* also number of text lines on VIS500 screen */
  80. /* The above values assume the VIS500 is in Alphanumeric mode;
  81.    the following values assume it is emulating a Tektronix 4010.
  82.    Note that windowv must be given a value using DVItoVDU's coordinate scheme
  83.    where top left pixel is (0,0).
  84. */
  85.   windowv = 92;            /* approx. height in TEK4010 pixels of 4 text lines;
  86.                    i.e. 4 * 780/34 */
  87.   windowh = 0;
  88.   windowht = 780 - windowv;
  89.   windowwd = 1024;
  90.  
  91.   MoveToTextLine = VIS500MoveToTextLine;
  92.   ClearTextLine = VIS500ClearTextLine;
  93.   ClearScreen = VIS500ClearScreen;
  94.   StartText = TEK4010StartText;
  95.   StartGraphics = TEK4010StartGraphics;
  96.   LoadFont = TEK4010LoadFont;
  97.   ShowChar = VIS500ShowChar;
  98.   ShowRectangle = VIS500ShowRectangle;
  99.   ResetVDU = VIS500ResetVDU;
  100.  
  101.   Write (GS);
  102.   Write (ESC);
  103.   Write ('@');            /* solid fill for rectangular draw and fill */
  104.   Write (CAN);
  105. }
  106.  
  107. /******************************************************************************/
  108.  
  109. Void VIS500MoveToTextLine (line)
  110. unsigned int  line;
  111. {
  112.   Write (CAN);            /* switch to Alphanumeric mode */
  113.   VIS500MoveAbs (line, 1);
  114. }
  115.  
  116. /******************************************************************************/
  117.  
  118. Void VIS500MoveAbs (row, col)
  119. unsigned int  row, col;
  120. {
  121.  
  122. /* Assuming we are in VT52 mode (Alphanumeric mode), move the cursor to the
  123.    given row and column.  Since DVItoVDU assumes top left corner of screen
  124.    is (row=1,col=1) we need to subtract 1 from both coordinates to get
  125.    the actual VT52 position on the screen.
  126. */
  127.  
  128.   Write (ESC);
  129.   Write ('Y');
  130.   Write ((char) (((int) ' ') + row - 1));
  131.   Write ((char) (((int) ' ') + col - 1));
  132. }
  133.  
  134. /******************************************************************************/
  135.  
  136. Void VIS500ClearTextLine (line)
  137. unsigned int  line;
  138. {
  139.   Write (CAN);            /* switch to Alphanumeric mode */
  140.   VIS500MoveAbs (line, 1);    /* move to start of line */
  141.   Write (ESC);
  142.   Write ('K');            /* erase to end of line */
  143. }
  144.  
  145. /******************************************************************************/
  146.  
  147. Void VIS500ClearScreen ()
  148. {
  149.   Write (CAN);            /* enable Alphanumeric display */
  150.   Write (ESC);
  151.   Write ('H');            /* move to top left of screen */
  152.   Write (ESC);
  153.   Write ('J');            /* erase to end of screen (Alphanumeric text) */
  154.   TEK4010ClearScreen ();    /* erase graphics */
  155. }
  156.  
  157. /******************************************************************************/
  158.  
  159. Void VIS500ShowChar (screenh, screenv, ch)/* ref point */
  160. unsigned int  screenh, screenv;
  161. char  ch;
  162. /* The TEK4010 Terse mode characters on the VIS500 need to be dragged down
  163.    so that any descenders will be below the baseline represented by screenv.
  164. */
  165. {
  166.   screenv = screenv + dragdown;
  167.   if (screenv > 779)
  168.   {
  169.     TEK4010ShowChar (screenh, 779, ch);/* drag down as far as possible */
  170.   }
  171.   else
  172.   {
  173.     TEK4010ShowChar (screenh, screenv, ch);
  174.   }
  175. }
  176.  
  177. /******************************************************************************/
  178.  
  179. /*ARGSUSED*/
  180. Void VIS500ShowRectangle (screenh, screenv,/* top left pixel */
  181.   width, height,        /* of rectangle */
  182.   ch)                /* black pixel */
  183. unsigned int  screenh, screenv, width, height;
  184. char  ch;
  185. /* Display the given rectangle without using the given black pixel character.
  186.    We assume that the top left position is correct and that the given
  187.    dimensions do not go beyond the screen edges.
  188.    If height and width > 1, we use the rectangular draw and fill command.
  189. */
  190. {
  191.   unsigned int  pos;
  192.  
  193.   if (height == 1)
  194.   {                /* show row vector */
  195.     pos = 779 - screenv;
  196.     Write (GS);
  197.     SendXYtek (screenh, pos);    /* move cursor to start of row */
  198.     SendXYtek (screenh + width - 1, pos);/* draw vector to end of row */
  199.   }
  200.   else
  201.     if (width == 1)
  202.     {                /* show column vector */
  203.       pos = 779 - screenv;
  204.       Write (GS);
  205.       SendXYtek (screenh, pos);    /* move cursor to start of column */
  206.       SendXYtek (screenh, pos - height + 1);/* draw vector to end of column */
  207.     }
  208.     else
  209.     {                /* assume height and width > 1; draw and fill
  210.                    rectangle */
  211.       pos = 779 - (screenv + height - 1);
  212.       Write (ESC);
  213.       Write ('/');
  214.       WriteCard (screenh);
  215.       Write (';');        /* left */
  216.       WriteCard (pos);
  217.       Write (';');        /* bottom */
  218.       WriteCard (width - 1);
  219.       Write (';');
  220.       WriteCard (height + 1);
  221.       Write ('y');
  222.     /* Note that there are a few problems with this command: - we need to subtract 1
  223.        from width.  While this prevents exceeding the right edge (reason unknown),
  224.        it causes missing pixel columns. - we need to ADD 1 to height to avoid
  225.        missing pixel rows. - the smallest rectangle drawn is 2 by 2. - the new
  226.        cursor position is undefined. These funnies are outweighed by the improved
  227.        efficiency in drawing large rectangles. */
  228.       havesentxy = FALSE;    /* need to re-synch cursor position */
  229.     }
  230. }
  231.  
  232. /******************************************************************************/
  233.  
  234. Void VIS500ResetVDU ()
  235. {
  236.   Write (CAN);            /* make sure terminal is in Alphanumeric mode */
  237. }
  238.  
  239. /******************************************************************************/
  240.